home *** CD-ROM | disk | FTP | other *** search
/ Fritz: All Fritz / All Fritz.zip / All Fritz / FILES / MISCEOUS / POSITI.LZH / POS.ASM next >
Assembly Source File  |  1987-10-18  |  7KB  |  181 lines

  1. NAME      POSITIVE
  2.  
  3. ; Porgram POS.ASM
  4. ; Purpose To utilize subliminal advertisement for POSITIVE ideas.
  5. ; Input   FROM DOS
  6. ;         POS I will quit smoking.
  7. ;         POS I do not enjoy smoking.
  8. ; Output  Once every three seconds the message will be displayed on the
  9. ;         CRT and then erased with virtually no effect on current contents
  10. ;         of the video.
  11.  
  12. PAGE      60,132
  13.  
  14. SYS       SEGMENT   AT 0
  15. INTERUPT  EQU       $
  16. SYS       ENDS
  17.  
  18. .MODEL    LARGE
  19. .CODE
  20.  
  21.           ORG       127                 ; STARTING
  22. COUNTER   DB        ?                   ; COUNTER FOR TICS
  23. BUFCNT    DB        ?                   ; CHARACTERS IN BUFFER 127 MAX
  24. BUFFER    DB        127 DUP (?)         ; COMMAND LINE BUFFER
  25.  
  26. COLS      EQU       13                  ; COLUMN NUMBER FOR DISPLAY
  27. BYTES     EQU       160                 ; NUMBER OF BYTES PER LINE
  28.  
  29. MAIN      PROC      FAR
  30.  
  31. VIDSEG    LABEL     WORD                ; ADDRESS OF VIDEO SEGMENT
  32.           JMP       SHORT INIT          ; INITIALIZE
  33. VIDOFFSET DW        ?                   ; OFFSET FOR WRITES
  34. VIDSTA    DW        ?                   ; VIDEO STATUS PORT
  35.  
  36. DOIT      PROC      NEAR
  37.           ASSUME    DS:@CODE
  38.  
  39.           STI
  40.           PUSHF                         ; FAKE THE INTERUPT
  41.           ORG       $+1
  42. OLDINT    DW        2 DUP (?)           ; OLD INTERUPT 08
  43.           ORG       $-5
  44.           CALL      FAR PTR INTERUPT    ; OFF TO ORIGINAL INTERUPT
  45.  
  46.           PUSH      AX                  ; SAVE WORKING REGISTERS
  47.           PUSH      BX
  48.           PUSH      CX
  49.           PUSH      DX
  50.           PUSH      SI
  51.           PUSH      DI
  52.           PUSH      DS
  53.           PUSH      ES
  54.  
  55.           PUSH      CS
  56.           POP       DS
  57.  
  58.           MOV       AX,VIDSEG           ; GET VIDEO SEGMENT COVERAGE
  59.           MOV       ES,AX
  60.           MOV       DX,VIDSTA           ; GET STATUS PORT
  61.  
  62.           DEC       COUNTER             ; TIME TO DISPLAY THE MESSAGE?
  63.           JNZ       SHOWEND             ; EXIT
  64.  
  65.           MOV       COUNTER,36          ; 1 TIME every 3 seconds
  66.  
  67.           MOV       DI,VIDOFFSET        ; SAVE FOR STRING OPERATIONS
  68.           LEA       SI,BUFFER           ; POINTER TO BUFFER
  69.           MOV       CL,BUFCNT           ; BYTE COUNT TO CL
  70.           XOR       CH,CH               ; SETUP FOR LOOP
  71.           CALL      NOSNOW              ; CHECK FOR RETRACE
  72. WRITE:
  73.           MOV       BL,BYTE PTR ES:[DI] ; SAVE CURRENT CONTENTS OF SCREEN
  74.           MOV       BYTE PTR [SI+64],BL ; SO I CAN RESTORE IT LATER
  75.           MOVSB
  76.           INC       DI                  ; ADJUST FOR ATTRIBUTE
  77.           LOOP      WRITE               ; FINISH
  78.  
  79.           LEA       SI,BUFFER+64
  80.           MOV       DI,VIDOFFSET
  81.           MOV       CL,BUFCNT           ; GET COUNT
  82.           XOR       CH,CH               ; CLEAR UPPER HALF
  83.           CALL      NOSNOW
  84. RESTLOOP:
  85.           MOVSB
  86.           INC       DI                  ; ADJUST FOR ATTRIBUTE
  87.           LOOP      RESTLOOP            ; FINISH
  88. SHOWEND:
  89.           POP       ES
  90.           POP       DS
  91.           POP       DI
  92.           POP       SI
  93.           POP       DX
  94.           POP       CX
  95.           POP       BX
  96.           POP       AX
  97.           IRET
  98. DOIT      ENDP
  99.  
  100. NOSNOW    PROC      NEAR
  101.           CMP       DX,0                ; CHECK FOR SNOW
  102.           JZ        SNOWEND             ; NO
  103.           PUSH      AX
  104. WAIT1:
  105.           IN        AL,DX
  106.           AND       AL,1
  107.           JNZ       WAIT1
  108. WAIT2:
  109.           IN        AL,DX
  110.           AND       AL,8
  111.           JZ        WAIT2
  112.           POP       AX
  113. SNOWEND:
  114.           RET
  115. NOSNOW    ENDP
  116.  
  117. INIT:     ASSUME    DS:NOTHING
  118.           MOV       CL,BUFCNT           ; GET BUFFER SIZE
  119.           CMP       CL,0                ; ANYTHING THERE ?
  120.           JA        BEGIN               ; YES
  121. INTERR:
  122.           MOV       DX,OFFSET ERR       ; POINTER TO ERROR MSG
  123.           MOV       AH,9
  124.           INT       21H
  125.           MOV       AX,4C01H
  126.           INT       21H                 ; TERMINATE
  127. ERR       DB        13,10,'No message on input. Terminating...',13,10,'$'
  128. BEGIN:
  129.           LEA       SI,BUFFER           ; POINT TO MESSAGE AREA
  130. LOAD:
  131.           LODSB                         ; INPUT A BYTE
  132.           CMP       AL,9                ; CHECK FOR TAB
  133.           JE        LOAD                ; TRY AGAIN..
  134.           CMP       AL,32               ; MAYBE A SPACE
  135.           JE        LOAD                ; TRY NEXT
  136.           CMP       AL,13               ; HOW ABOUT CR
  137.           JNE       FOUND               ; PROCESS MESSAGE
  138.           JMP       INTERR              ; CR FOUND BUT NO DATA....
  139. FOUND:
  140.           XOR       CH,CH               ; CLEAR UPPER HALF
  141.           SHL       CX,1                ; EVEN OFF TO 160
  142.           MOV       AX,BYTES
  143.           SUB       AX,CX               ; CLACULATE
  144.           SHR       AX,1                ; CENTER TEXT
  145.           ADD       AX,COLS*BYTES       ; SET TO ROW/COLUMN
  146.           TEST      AL,1                ; ODD NUMBER ?
  147.           JZ        NOTODD              ; NO
  148.           INC       AX
  149. NOTODD:
  150.           MOV       VIDOFFSET,AX        ; SAVE FOR INTERUPT
  151.           MOV       AX,40H              ; POINT TO PARAMETER TABLE
  152.           MOV       ES,AX               ; COVER WITH ES
  153.           MOV       BX,0B000H           ; ASSUME CGA FOR NOW
  154.           MOV       DX,0                ; WITH STATUS PORT SAME
  155.           MOV       AL,ES:[10h]         ; GET EQUIPMENT FLAG BYTE
  156.           AND       AL,30H              ; IS IT MONO
  157.           JZ        MONO                ; YES
  158.           MOV       DX,03DAH            ; SETUP FOR CGA
  159.           ADD       BX,800H             ; INC TO SEGMENT
  160.           MOV       AL,ES:[87]          ; GET EGA BYTE
  161.           CMP       AL,0                ; IS IT EGA?
  162.           JZ        MONO                ; NO CONTINUE
  163.           MOV       DX,0                ; YES - NOSNOW HERE
  164. MONO:
  165.           MOV       VIDSEG,BX           ; SAVE SEGMENT
  166.           MOV       VIDSTA,DX           ; SAVE STATUS PORT
  167.  
  168.           MOV       AX,3508H            ; GET CURRENT INTERUPT
  169.           INT       21H
  170.           MOV       OLDINT,BX           ; SAVE FOR THIS ROUTINE
  171.           MOV       OLDINT[2],ES
  172.           MOV       COUNTER,1           ; INITIALIZE THE COUNTER
  173.           MOV       DX,OFFSET DOIT      ; READY FOR RESIDENTCY
  174.           MOV       AX,2508H
  175.           INT       21H
  176.           MOV       DX,OFFSET INIT      ; INIT IS END
  177.           INT       27H
  178. MAIN      ENDP
  179. END       MAIN
  180.  
  181.